import PyPDF2
import os
from PyPDF2 import PdfWriter, PdfFileMerger, PdfFileWriter
import fitz  # PyMuPDF


def merge_pages_to_A4(input_pdf, output_pdf):
    doc = fitz.open(input_pdf)  # 打开源PDF文件
    new_doc = fitz.open()  # 创建一个新的PDF文档对象

    # 定义A4纸大小
    a4_width, a4_height = 595, 842

    for page_num in range(0, len(doc), 2):  # 每次处理两页
        # 创建A4尺寸的新页面
        new_page = new_doc.new_page(width=a4_width, height=a4_height)

        for i in range(2):  # 处理两页，如果有的话
            if page_num + i < len(doc):
                page = doc.load_page(page_num + i)  # 加载当前页
                src_rect = page.rect  # 获取源页面的矩形区域
                scale_x=(a4_width / 2) / src_rect.width
                scale_y=a4_height / src_rect.height
                scale = min(scale_x, scale_y)  # 计算缩放比例

                # 计算目标矩形区域，保持内容居中
                # target_rect = fitz.Rect(0, i * a4_height / 2, a4_width / 2, (i + 0.5) * a4_height)
                target_rect = fitz.Rect(0, i * a4_height / 2, a4_width, (i + 0.5) * a4_height)
                if i == 1:  # 如果是第二页，调整位置到页面的下半部分
                    target_rect.y0 = a4_height / 2
                    target_rect.y1 = a4_height

                # 将页面内容绘制到新页面的目标矩形区域中，应用缩放
                new_page.show_pdf_page(target_rect, doc, page_num + i)

    new_doc.save(output_pdf)  # 保存新的PDF文档
    print(f"合并后的PDF文件已保存为：{output_pdf}")



# 合并页数
def merge_pages(input_pdf, output_pdf):
    pdf_writer = PyPDF2.PdfWriter()

    with open(input_pdf, 'rb') as pdf_file:
        pdf_reader = PyPDF2.PdfReader(pdf_file)
        num_pages = len(pdf_reader.pages)

        for i in range(0, num_pages, 2):
            page1 = pdf_reader.pages[i]
            if i + 1 < num_pages:
                page2 = pdf_reader.pages[i + 1]
            else:
                page2 = None

            # 创建一个新的PDF 页面大小为A4纸张大小
            new_page = PyPDF2.PageObject.create_blank_page('pdf', width=595, height=842)
            print('页面缩放比例')
            top = page1.mediabox.top
            print(top)
            # 计算原始PDF的页面缩放比例
            # scaling_factor = 0.5 * 842 / top
            # print(scaling_factor)
            # 将第一页缩放并添加到新的PDF页面的上半部分
            # page1.scale(1,1)
            # page1.add_transformation(PyPDF2.Transformation().translate(0, 421))
            new_page.merge_page(page1)
            # 如果存在第二页，则缩放并添加到新的PDF页面的下半部分
            if page2:
                # page2.scale(1,1)
                # page2.add_transformation(PyPDF2.Transformation().translate(0,0))
                new_page.merge_page(page2)
                # new_page.mergeTranslatedPage(page2, page1.mediaBox.getUpperRight_x(), 0)
            # 将新的页面添加到新的PDF文件中
            pdf_writer.add_page(new_page)

        with open(output_pdf, 'wb') as output_file:
            pdf_writer.write(output_file)


# 合并发票PDF文件为一个
def merge_pdf(path):
    filenames = os.listdir(path)
    print('发票文件共：' + str(len(filenames)) + ' 个')
    # 获取pdf
    path_names = []
    # 循环获取文件路径
    for filename in filenames:
        path_names.append(os.path.join(path, filename).replace('\\', '/'))

    # 合并PDF
    pdf_merge = PyPDF2.PdfMerger()
    # 循环合并
    for path_name in path_names:
        pdf_merge.append(path_name)

    pdf_merge.write('文件合并结果.pdf')


if __name__ == "__main__":
    print('合并一下文件：'+os.getcwd())
    merge_pdf(os.getcwd()+'/Fapiao')
    print('发票合并为一个了')

    input_pdf = '文件合并结果.pdf'
    output_pdf = 'Fapiao.pdf'
    merge_pages_to_A4(input_pdf, output_pdf)
    # merge_pages(input_pdf, output_pdf)
    print('多页发票合并页数了')
